自作iOSアプリからmixi2アプリに画像を共有する際の実装ポイント
2024年12月16日に「mixi2」がリリースされた。早速招待を受けてアカウントを作成し、知人をフォローした。初期のTwitterに似た雰囲気を感じた。
本記事では、自作iOSアプリからmixi2に画像を共有する際の実装方法と注意点について解説する。
自作iOSアプリからmixi2アプリに画像とハッシュタグを共有できない
自作iOSアプリからmixi2アプリへ画像とハッシュタグを共有しようとした際、画像が認識されず、ハッシュタグのみが表示される問題が発生した。
画像の受け取りは、共有先アプリ側の実装によってサポートされるフォーマットが異なる。過去のSNSアプリへの画像や動画共有の調査経験から、受け取り可能なフォーマットにはアプリごとに違いがあることが分かっている。
詳細については「自作アプリからSNSアプリへ画像を共有する最適なフォーマットは?UIImage、Data、URL の比較調査した」を参考のこと。
私が開発しているiOSアプリでは、各SNSアプリのBundle IDを調査し、それぞれのアプリに適したフォーマットでメディアを共有している。以下の表は、調査時点での各アプリの挙動をまとめたものである。
共有先 | メディアタイプ | UIActivityItemSource のitemの型 | 備考 |
---|---|---|---|
カメラロール | 静止画 | URL | |
カメラロール | 動画 | URL | |
Twitter(現X) | 静止画 | URL | |
Twitter(現X) | 動画 | URL | |
Bluesky | 静止画 | UIImage | ハッシュタグを一緒に渡すとBlueskyアプリがクラッシュする |
Bluesky | 動画 | 共有できない | |
Mastodon | 静止画 | Data | |
Mastodon | 動画 | URL | |
Threads | 静止画 | UIImage | ハッシュタグは無視される |
Threads | 動画 | 共有できない | |
静止画 | URL | ハッシュタグを一緒に渡すとエラーが発生する | |
動画 | URL | ハッシュタグを一緒に渡すとエラーが発生する | |
mixi2 🆕 | 静止画 | UIImage | |
mixi2 🆕 | 動画 | 共有できない | 灰色のダイアログが表示される |
mixi2アプリへ画像を共有するための実装方法
まず、mixi2アプリの固有アクティビティタイプ(Bundle ID)を定義する必要がある。以下のコードで定義を追加する。
extension UIActivity.ActivityType {
static let mixi = UIActivity.ActivityType(rawValue: "jp.co.mixi.mercury.ShareExtension")
}
次に、mixi2アプリでは UIImage
オブジェクトを直接渡すことで画像を認識できることが判明した。そのため、アクティビティタイプが mixi
の場合には UIImage
を渡し、それ以外の場合にはファイルURLを渡すように設定する。以下は実装例である。
import LinkPresentation
import UIKit
import UniformTypeIdentifiers
final class ImageFileActivityItem: NSObject, UIActivityItemSource {
let fileUrl: URL
let fileName: String
let image: UIImage?
init(fileUrl: URL, image: UIImage?) {
self.fileUrl = fileUrl
self.image = image
self.fileName = fileUrl.lastPathComponent
}
func activityViewControllerPlaceholderItem(_: UIActivityViewController) -> Any {
image ?? UIImage()
}
func activityViewController(_: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
return switch activityType {
case .mixi:
image
default:
fileUrl
}
}
func activityViewController(_: UIActivityViewController, subjectForActivityType _: UIActivity.ActivityType?) -> String {
fileName
}
func activityViewController(_: UIActivityViewController, dataTypeIdentifierForActivityType _: UIActivity.ActivityType?) -> String {
UTType.image.identifier
}
func activityViewControllerLinkMetadata(_: UIActivityViewController) -> LPLinkMetadata? {
guard let image = image else { return nil }
let metadata = LPLinkMetadata()
metadata.title = fileName
metadata.imageProvider = NSItemProvider(object: image)
return metadata
}
}
このコードでは、UIActivityViewController
を使用して画像を他のアプリ(本記事ではmixi2が対象)に共有するためのカスタムクラス ImageFileActivityItem
を実装している。UIActivityItemSource
プロトコルを利用し、共有先アプリに応じて適切なデータを提供する仕組みとなっている。
修正後の動作確認
以下は、修正後に画像とハッシュタグを共有した際の投稿画面のスクリーンショットである。
画像とハッシュタグがmixi2アプリの投稿画面に正しく表示されていることが確認できる。
mixi2アプリの開発者の方へ
リリースお疲れ様でした! Twitter(現X)方式(file:///var/mobile〜
で始まるURL)やMastodonアプリ方式(Data)での画像受け取りのサポートをご検討いただければ幸いです。さらに、画像が3枚までしか共有できない点や、写真アプリからも動画を共有できない点など修正していただければとても嬉しいです!
まとめ
本記事では、自作iOSアプリからmixi2アプリに画像を共有する際の実装方法について解説した。UIActivityViewController
を利用し、mixi2アプリ固有のフォーマットに対応することで、画像とハッシュタグを正しく共有できるようになった。
この記事が、自作アプリからmixi2アプリへの画像共有機能を実装する際の参考になれば幸いである。